﻿
namespace MugenInjection.Interception.Interface
{
    /// <summary>
    /// Intercepts the call to action related to methods, properties, and events.
    /// </summary>
    public interface IInterceptorProcess
    {
        /// <summary>
        /// Gets the priority.
        /// </summary>
        int Priority { get; }

        /// <summary>
        /// Intercepts the method using the specified <see cref="IMethodInterceptor"/>.
        /// </summary>
        /// <param name="methodInterceptor">The specified <see cref="IMethodInterceptor"/>.</param>
        void InterceptMethod(IMethodInterceptor methodInterceptor);

        /// <summary>
        /// Intercepts the get property method using the specified <see cref="IPropertyGetInterceptor"/>.
        /// </summary>
        /// <param name="propertyGetInterceptor">The specified <see cref="IPropertyGetInterceptor"/></param>
        void InterceptGetProperty(IPropertyGetInterceptor propertyGetInterceptor);

        /// <summary>
        /// Intercepts the set property method using the specified <see cref="IPropertySetInterceptor"/>.
        /// </summary>
        /// <param name="propertySetInterceptor">The specified <see cref="IPropertySetInterceptor"/>.</param>
        void InterceptSetProperty(IPropertySetInterceptor propertySetInterceptor);

        /// <summary>
        /// Intercepts the add event method using the specified <see cref="IEventAddInterceptor"/>.
        /// </summary>
        /// <param name="eventAddInterceptor">The specified <see cref="IEventAddInterceptor"/>.</param>
        void InterceptAddEvent(IEventAddInterceptor eventAddInterceptor);

        /// <summary>
        /// Intercepts the remove event method using the specified <see cref="IEventRemoveInterceptor"/>.
        /// </summary>
        /// <param name="eventRemoveInterceptor">The specified <see cref="IEventRemoveInterceptor"/>.</param>
        void InterceptRemoveEvent(IEventRemoveInterceptor eventRemoveInterceptor);
    }
}